// FreeRTOSConfig.h 头文件参考配置
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

#if defined(__ICCARM__) || defined(__CC_ARM)
	#include <stdint.h>
	extern uint32_t SystemCoreClock;
#endif


/*----------------------------------- 基础配置 ------------------------- */
/* 内核的调度方式: 为 1 使用抢占式调度方式, 为 0 使用合作调度方式*/
#define configUSE_PREEMPTION							1

/* 时间片调度： 不定义默认为1, 使能*/
#define configUSE_TIME_SLICING 							1

/* 查找下一个运行的任务的方法：1.为使用硬件的方法, 为 0 使用通用方法*/
#define configUSE_PORT_OPTIMISED_TASK_SELECTION			1

/* 系统时钟频率: 对于 STM32 微控制器, 可以使用 SystemCoreClock 这个全局变量*/
#define configCPU_CLOCK_HZ								( SystemCoreClock )

/* 系统时钟节拍: 节拍频率, 其倒数就是一个时间片的长度 */
#define configTICK_RATE_HZ								( ( TickType_t ) 1000 )

/* 任务优先级数量 */
#define configMAX_PRIORITIES							( 5 )

/* 最小任务堆栈: 空闲任务使用的堆栈大小 */
#define configMINIMAL_STACK_SIZE						( ( unsigned short ) 128 )

/* 堆内存大小: 供 FreeRTOS 使用的总堆内存大小, F103C8 的 RAM 只有 20Kb */
#define configTOTAL_HEAP_SIZE							( ( size_t ) ( 10 * 1024 ) )

/* 动态内存分配: 为1或不定义支持*/
#define configSUPPORT_DYNAMIC_ALLOCATION				1

/* 任务名长度 */
#define configMAX_TASK_NAME_LEN							( 10 )

/* 系统时钟节拍计数器数据类型: 为1使用16位无符号数, 为0使用32位无符号数*/
#define configUSE_16_BIT_TICKS							0

/* 空闲任务与空闲任务同优先级任务之间的切换: 为1不等空闲任务时间片用完, 就可立即切换到空闲任务同优先级的任务*/
#define configIDLE_SHOULD_YIELD							1

/* 信号量配置: 为 1 使用, 为 0 不使用*/
#define configUSE_MUTEXES								1
#define configUSE_RECURSIVE_MUTEXES						1
#define configUSE_COUNTING_SEMAPHORES					1

/* 队列记录数: 记录队列和信号量最大数目*/
#define configQUEUE_REGISTRY_SIZE						8

/* 任务标签: 为 1 使用, 为 0 不使用*/
#define configUSE_APPLICATION_TASK_TAG					0

/* 钩子函数: 为 1 使能钩子函数, 钩子函数需要由用户实现, 为 0 不使能钩子函数*/
#define configUSE_IDLE_HOOK								0
#define configUSE_TICK_HOOK								0
#define configUSE_MALLOC_FAILED_HOOK					0
#define configCHECK_FOR_STACK_OVERFLOW					0

/*----------------------------------- 基础配置 ------------------------- */
/* 是否使用协程: 为0不使用, 在抢占式调度方式中也可使用协程 */
#define configUSE_CO_ROUTINES							0

/* 协程的有效优先级数量 */
#define configMAX_CO_ROUTINE_PRIORITIES					( 2 )

/*----------------------------------- 任务运行配置信息 ------------------- */
/* 可视化跟踪和调试及时间统计: 为1开启, 为0不启用*/
#define configUSE_TRACE_FACILITY						1
#define configUSE_STATS_FORMATTING_FUNCTIONS			1
#define configGENERATE_RUN_TIME_STATS					0

/*----------------------------------- 软件定时器配置 --------------------- */
/* 是否使用软件定时器: 为1使用*/
#define configUSE_TIMERS								1

/* 定时器服务任务的默认优先级*/
#define configTIMER_TASK_PRIORITY						( 2 )

/* 软件定时器命令队列长度 */
#define configTIMER_QUEUE_LENGTH						10

/* 软件定时器服务任务堆栈大小 */
#define configTIMER_TASK_STACK_DEPTH					( configMINIMAL_STACK_SIZE * 2 )

/*----------------------------------- 可选 API 函数配置 ----------------- */
/* 宏为 1 对应的 API 函数有效, 为 0 对应的 API 函数无效*/
#define INCLUDE_vTaskPrioritySet						    1
#define INCLUDE_uxTaskPriorityGet						    1
#define INCLUDE_vTaskDelete								      1
#define INCLUDE_vTaskSuspend							      1
#define INCLUDE_vTaskDelayUntil							    1
#define INCLUDE_vTaskDelay								      1
#define INCLUDE_xTaskGetSchedulerState					1
#define INCLUDE_xTaskGetCurrentTaskHandle				1
#define INCLUDE_uxTaskGetStackHighWaterMark			1
#define INCLUDE_xTaskGetIdleTaskHandle					1
#define INCLUDE_xTimerGetTimerDaemonTaskHandle  1
#define INCLUDE_pcTaskGetTaskName						    1

/*--------------------------  与 ARM Cortex-M 特定硬件相关的中断配置 ------ */
#ifdef __NVIC_PRIO_BITS
	/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4        /* 15 priority levels */
#endif

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0xf

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5

#define configKERNEL_INTERRUPT_PRIORITY 		( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

/*----------------------------------- 定义在开发过程中捕获错误 ----------- */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/*----------------------------------- 与实际硬件中断服务函数相关的配置 ---- */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */
